﻿/// @file kenv.c
#include "stdafx.h"
#include "sbcs.h"

//////////////////////////////////////////////////////////////////////////
// 환경 변수

/// 사용자 이름을 얻어온다.
/// @date 2013-12-22
/// @param [in,out] buf 널값이 아니면 버퍼.
/// @param size		    크기.
/// @return 정수 값.
kint k_getusername(char* buf, ksize_t size)
{
#if _SB_WINDOWS_
	return k_getenv("USERNAME", buf, size);
#else
	return k_getenv("USER", buf, size);
#endif
}

/// 컴퓨터 이름을 얻어온다.
/// @date 2013-12-22
/// @param [in,out] buf 널값이 아니면 버퍼.
/// @param size		    크기.
/// @return 정수 값.
kint k_getcomputername(char* buf, ksize_t size)
{
#if _SB_WINDOWS_
	return k_getenv("COMPUTERNAME", buf, size);
#else
	return k_getenv("HOSTNAME", buf, size);
#endif
}

/// 환경 변수를 얻는다.
/// @date 2013-12-22
/// @param name		    이름.
/// @param [in,out] buf 널값이 아니면 버퍼.
/// @param size		    크기.
/// @return 정수 값.
kint k_getenv(const char* name, char* buf, ksize_t size)
{
#if _SB_WINDOWS_ 
#if _SB_WINDOWS_DESKTOP_
	DWORD dw = GetEnvironmentVariableA(name, buf, (DWORD)size);

	if (buf)
	{
		if (dw >= size)
			*buf = '\0';
		else
			buf[dw] = '\0';
	}

	return (kint)dw;
#else
	// 어카지.. 지원 안하는 것 같은데
	return 0;
#endif
#else
	const char* ret = getenv(name);
	kint len;

	if (!ret)
		return 0;

	len = k_strlen(ret);

	if (size == 0 || !buf)
		return len;

	if (len >= size)
		*buf = '\0';
	else
		k_strcpy(buf, ret);

	return len;
#endif
}

/// 환경 변수를 쓴다.
/// @date 2013-12-22
/// @param name  이름.
/// @param value 값.
/// @return 성공하면 참을 실패하면 거짓을 반환한다.
kcham k_setenv(const char* name, const char* value)
{
#if _SB_WINDOWS_
#if _SB_WINDOWS_DESKTOP_
	return SetEnvironmentVariableA(name, value);	// name 널값 알아서 처리해줌
#else
	// 어카지.. 지원 안하는 것 같은데
	return 0;
#endif
#else
	char* buf;
	char* psz;
	kint l1, l2;

	k_return_value_if_fail(name != NULL, FALSE);

	l1 = k_strlen(name);
	l2 = value ? k_strlen(value) : 0;
	psz = buf = alloca(l1 + 1/*=*/ + l2 + 1);

	psz = k_strpcpy(psz, name);

	psz = k_strpcpy(psz, "=");

	if (l2 > 0)
		k_strcpy(psz, value);

	return putenv(buf) == 0;
#endif
}

/// 전역 인덱싱 순번을 얻는다.
/// 32비트 시스템에서는 32비트의, 64비트 시스템에서는 64비트의 고유 숫자를 얻는다
/// 만약 오버플로우가 발생하면 다시 0으로 돌아간다
/// @date 2013-12-22
/// @return 인덱싱 숫자.
ksize_t k_nth(void)
{
	static ksize_t s_n = 1;

	return s_n++;
}

